
class SingleInstance {
    private static volatile SingleInstance instance = null;
    //volatile修饰确保了当instance的值改变后,其他线程能够立即感知到,从而获取新的值

    private SingleInstance() {

    }

    public static SingleInstance getInstance() {
        //外层if为了再已经有实例的情况下在进入同步方法块内,进行不必要的同步
        if (instance == null){
            synchronized (SingleInstance.class) {
                if (instance == null) {
                    //内层if用来确保只有一个实例
                    //在同步方法块内,当一个线程进入后,此时if为真,创建实例
                    //第一个线程释放锁对象后,下一个线程进入同步方法快中,此时进行if判断为了防止创建更多的实例
                    instance = new SingleInstance();
                }
            }
        }
        return null;
    }
}

public class Demo21 {

}
